import { describe, it, expect, vi, beforeEach } from 'vitest';

import { BaseHttpClient } from '@thalorlabs/api';

import { {{NAME_PASCAL}}Client } from '../src/{{NAME_PASCAL}}Client';

const mockHandleRequest = vi.fn();
vi.spyOn(BaseHttpClient.prototype as any, 'handleRequest').mockImplementation(
  mockHandleRequest
);

describe('{{NAME_PASCAL}}Client', () => {
  let client: {{NAME_PASCAL}}Client;

  beforeEach(() => {
    vi.clearAllMocks();
    client = new {{NAME_PASCAL}}Client();
  });

  describe('constructor', () => {
    it('sets serviceName to {{NAME}}', () => {
      expect(client.serviceName).toBe('{{NAME}}');
    });
  });

  describe('getData', () => {
    it('returns data from the API', async () => {
      mockHandleRequest.mockResolvedValueOnce({
        response: { data: { id: 'test-123' } },
        durationMs: 50,
      });

      const result = await client.getData();

      expect(result).toEqual({ id: 'test-123' });
    });

    it('calls handleRequest with GET /', async () => {
      mockHandleRequest.mockResolvedValueOnce({
        response: { data: { id: 'test' } },
        durationMs: 10,
      });

      await client.getData();

      expect(mockHandleRequest).toHaveBeenCalledWith(
        expect.objectContaining({ method: 'GET', url: '/' }),
        expect.objectContaining({ method: 'GET', url: '/' })
      );
    });

    it('propagates errors', async () => {
      mockHandleRequest.mockRejectedValueOnce(new Error('Network error'));

      await expect(client.getData()).rejects.toThrow('Network error');
    });
  });
});
